package com.atguigu.realtime.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;

import java.sql.Connection;
import java.util.List;

public class DimUtil {
    public static JSONObject readDimFromPhoenix(Connection phoenixConn, String table, Long id) {
        String sql = "select * from "+ table + " where id = ? ";

        Object[] args = {id.toString()};
        List<JSONObject> list = JdbcUtil.queryList(phoenixConn, sql, args, JSONObject.class);

        // 防止获得空指针（获取对象但是没有值），但是一般都下单了，是有对象的
        return list.size() == 0 ? new JSONObject():list.get(0);
    }

    public static JSONObject readDim(Connection phoenixConn, Jedis jedis, String table, Long id) {
       // 1. 先从redis读取
        JSONObject dim = readDimFromRedis(jedis, table, id);
        //2.如果缓存中没有，从phoenix 读取，
        if (dim == null) {
            System.out.println(table+" " +id + "走数据库》》");
           dim = readDimFromPhoenix(phoenixConn, table, id);

            //3.再把维度数据存入到缓存中
            writeDimToRedis(jedis, table, id, dim);

        }else {
            System.out.println(table+" " +id + "走缓存。。。》");
        }



        return dim;
    }

    private static void writeDimToRedis(Jedis jedis, String table, Long id, JSONObject dim) {
        String key = table + ":" + id;
        String value = dim.toJSONString();
              /*jedis.set(key, value);
            jedis.expire(key, 2 * 24 * 60 * 60);*/
        jedis.setex(key,2*24*60*60,value); // 对每条数据 设置过期时间
    }

    private static JSONObject readDimFromRedis(Jedis jedis, String table, Long id) {
        String key = table + ":" +id;
        String s = jedis.get(key);
        if (s != null) {
            return JSON.parseObject(s);
        }
        return null;

    }
}
/*
string:
key:
    表名:id
value:
    json格式字符串


如果设计redis的缓存的数据结构:

方便存取

string

key                     value
"dim_user_info:1"       json格式的字符串
好处:
1. 方便读写
2. 单独的给每条维度设置过期时间

坏处: key的数量比较多, 不方便管理.   其实可以通过一个专门数据来存储维度（16个库，一般默认0号库，可以存其他库）

list

key                 value
"dim_user_info"     这个表的每行数据的json格式

好处: key比较少, 一张表一个key
坏处: 1. 读不方便
      2. 没有办法给每个数据单独设置过期时间
set
比list 多个去重功能

hash
key             field      value
表名              id       json格式字符串
                  id       json格式字符串
优点: key比较少   读写方便
缺点: 每条数据没有办法单独设置过期时间

zset ：带分数，待排序


 */

